package src;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class UserLogin {
    public static void main(String[] args) {
        ArrayList<userListXinXI> list = new ArrayList<>();//创建用户集合存储信息
        Scanner sc = new Scanner(System.in);
//        登录界面
        while (true) {
            System.out.println("-------Test欢迎来到学生管理系统-------");
            System.out.println("请选择操作：1：登录 2：注册 3：忘记密码 4:退出");
            String choose = sc.next();
            switch (choose) {
                case "1" -> Login(list);
                case "2" -> Register(list);
                case "3" -> ForgetPassword(list);
                case "4" -> {
                    System.out.println("谢谢使用，再见");
                    System.exit(0);//结束系统操作
                }

                default -> System.out.println("没有这个选项");
            }
        }

    }

    private static void ForgetPassword(ArrayList<userListXinXI> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入要修改密码的账户");
        String forgetUserName = sc.next();
        boolean flag5 = contains(list, forgetUserName);
        if (!flag5) {
            System.out.println("用户名" + forgetUserName + "未注册，请先注册");
            return;
        }
        userListXinXI forget = null;//拿到对应忘记密码的用户
        while (true) {
            System.out.println("请输入要修改用户" + forgetUserName + "的身份证号码");
            String forgetID = sc.next();
            System.out.println("请输入要修改用户" + forgetUserName + "的手机号码");
            String forgetNumber = sc.next();
//        通过输入注册的用户名拿到对应的用户的信息
            int index = findIndex(list, forgetUserName);
            forget = list.get(index);
            if (!(forget.getIdCard().equalsIgnoreCase(forgetID) && forget.getPhoneNumber().equals(forgetNumber))) {
                System.out.println( forgetUserName + "身份证号或手机号错误，不能修改");
                continue;
            }
            break;
        }
        while (true) {
            System.out.println("请输入新的密码");
            String password1 = sc.next();
            System.out.println("请再输入新的密码");
            String password2 = sc.next();
            if (!(password2.equals(password1))){
                System.out.println("输入的密码不一致重请新输入");
                continue;
            }
            forget.setPassword(password1);
            System.out.println("修改成功");
            break;
        }
    }

    //拿到忘记密码功能中的对应的用户名索引
    private static int findIndex(ArrayList<userListXinXI> list, String forgetUserName) {
        for (int i = 0; i < list.size(); i++) {
            userListXinXI userListXinXI = list.get(i);
            if (userListXinXI.getUserName().equals(forgetUserName)) {
                return i;
            }
        }
        return -1;
    }


    //注册界面填写用户信息注册判断主程序
    private static void Register(ArrayList<userListXinXI> list) {
        userListXinXI u = new userListXinXI();//创建新的用户
        Scanner sc = new Scanner(System.in);//键盘输入用户名
//        用户名的判断
        while (true) {
            System.out.println("输入要创建的用户名:");
            String Name = sc.next();
            boolean flag = CheckName(Name);
            if (!flag) {
                System.out.println("用户名错误，请重新输入");
                continue;
            }
            boolean flag1 = contains(list, Name);//用户名唯一性判断
            if (flag1) {
                System.out.println("用户名重复请重新输入");
            }
            u.setUserName(Name);
            System.out.println("用户名设置成功");
            break;
        }
        System.out.println();
//        用户密码2次判断
        while (true) {
            System.out.println("输入要创建的用户密码");
            String password1 = sc.next();
            System.out.println("再次输入要创建的用户密码");
            String password2 = sc.next();
            if (!(password1.equals(password2))) {
                System.out.println("密码不一致请重新输入");
            } else {
                u.setPassword(password1);
                System.out.println("密码设置成功");
                break;
            }
        }
        System.out.println();
//        id的判断
        while (true) {
            System.out.println("输入要创建的用户的身份证号");
            String ID = sc.next();
            boolean flag2 = CheckId(ID);
            if (flag2) {
                u.setIdCard(ID);
                System.out.println("身份证号设置成功");
                break;
            } else {
                System.out.println("输入的身份证号错误，请重新输入");
            }
        }
//        手机号的判断
        while (true) {
            System.out.println("输入要创建的用户的手机号");
            String Number = sc.next();
            boolean flag3 = CheckNumber(Number);
            if (flag3) {
                u.setPhoneNumber(Number);
                System.out.println("手机号设置成功");
                break;
            } else {
                System.out.println("手机号错误，重新输入");
            }
        }
        list.add(u);
        System.out.println("用户注册成功");
    }


    //          手机号判断
    private static boolean CheckNumber(String number) {
        if (number.length() != 11) {
            return false;
        }
        if (number.startsWith("0")) {
            return false;
        }
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            } else {
                return true;
            }
        }
        return true;
    }

    //id的判断
    private static boolean CheckId(String id) {
        if (id.length() != 18) {
            return false;
        }
        if (id.startsWith("0")) {
            return false;
        }
        for (int i = 0; i < id.length() - 1; i++) {
            char c = id.charAt(i);
            if (!(c >= '0' && c <= '9')) {
                return false;
            }
        }
        char x = id.charAt(id.length() - 1);
        if (x >= '0' && x <= '9' || x == 'x' || x == 'X') {
            return true;
        } else {
            return false;
        }
    }

    //判断用户名的唯一性
    private static boolean contains(ArrayList<userListXinXI> list, String Name) {
        for (int i = 0; i < list.size(); i++) {
            userListXinXI u = list.get(i);
            boolean equals = u.getUserName().equals(Name);
            if (equals) {
                return true;
            }
        }
        return false;
    }

    //验证用户名长度>3 <15,有字母，且不是全数字
    private static boolean CheckName(String Name) {
        int length = Name.length();
        if (length < 3 || length > 15) {
            return false;
        }
//        遍历字符串得到到用户名
        int count = 0;//统计有字母个数
        for (int i = 0; i < Name.length(); i++) {
            char c = Name.charAt(i);
//            判断元素有字母加数字
            if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                return false;
            }
//            用户名不能全是数字，也就是说里面有字母就行
            if (((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
                count++;
                break;
            }

        }
        return count > 0;//说明里面有字母
    }

    //登录界面的判断，加验证功能
    private static void Login(ArrayList<userListXinXI> list) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名");
            String userName = sc.next();
            boolean flag3 = contains(list, userName);
            if (!flag3) {
                System.out.println("用户名未注册，请先注册");
                return;//结束方法
            }
            System.out.println("请输入密码");
            String password = sc.next();
//        获取验证码
            while (true) {
                String code = getCode();
                System.out.println("验证码：" + code);
                System.out.println("请输入验证码");
                String code1 = sc.next();
                boolean flag4 = code.equalsIgnoreCase(code1);
                if (!flag4) {
                    System.out.println("验证码错误请重新输入");
                } else {
                    System.out.println("验证成功");
                    break;
                }
            }
//        验证集合中是否有改输入的用户名和密码
//        可以将零散的数据，封装成一个对象，传递的时候传递对象就可
            userListXinXI userInfo = new userListXinXI(userName, password, null, null);
            boolean flag5 = checkUserInfo(list, userInfo);
            if (flag5) {
                System.out.println("登录成功,欢迎使用学生管理系统");
                StudentManagementSystem ss = new StudentManagementSystem();//生成一个新的信息管理系统
                ss.startStudentManagementSystem();//调用学生信息 管理系统，中的对象进行操作
                break;
            } else {
                System.out.println("登录失败，用户名或密码错误");
                if (i == 2) {
                    System.out.println("当前账号" + userName + "被锁定请联系管理员进行解锁");
                    return;//账号锁定了直接结束方法
                } else {
                    System.out.println("用户名或密码错误，还剩下" + (2 - i) + "次机会");
                }
            }
        }

    }

    //判断用户登录在集合中是否存在
    private static boolean checkUserInfo(ArrayList<userListXinXI> list, userListXinXI userInfo) {
        for (int i = 0; i < list.size(); i++) {
            userListXinXI u = list.get(i);
            if (u.getUserName().equals(userInfo.getUserName()) && u.getPassword().equals(userInfo.getPassword())) {
                return true;
            }
        }
        return false;
    }

    //获取验证码
    public static String getCode() {
        ArrayList<Character> list = new ArrayList<>();//创建字符集合来放字母
        for (int i = 0; i < 26; i++) {
            list.add((char) ('a' + i));//将字母添加剂到集合添加26次，并且强转化类型
            list.add((char) ('A' + i));//将字母添加剂到集合添加26次，并且强转化类型
        }
//        创建容器
        StringBuilder sb = new StringBuilder();
//        随机将字母抽取4次
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int randomIndex = r.nextInt(list.size());//生成随机索引4次
            Character character = list.get(randomIndex);//拿到4次随机生成的字母
            sb.append(character);//拿到的字母添加到stringbuilder容器中
        }
        int number = r.nextInt(10);//生成0-9的数字
        sb.append(number);//添加到容器中
//        将里面的内容进行随机
        char[] cha = sb.toString().toCharArray();
        int randomX = r.nextInt(cha.length);//随机索引
        char temp = cha[randomX];
        cha[cha.length - 1] = temp;
        cha[randomX] = cha[cha.length - 1];
        return new String(cha);
    }

}

